#include <iostream>
#include <csignal>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;

void Print(sigset_t& sig){
    for(int i = 31;i > 0;i--){
        if(sigismember(&sig,i)){
            cout << "1";
        }
        else{
            cout << "0";
        }
    }
    cout << endl;
}
void func(int signal){
    cout << "捕捉到信号："<<signal << endl; 
    
    // if(signal == 18)
    // {
    //     cout << "收到18号信号"<<endl;
    // }

}
int main()
{
    //将所有信号屏蔽
    sigset_t block,oldblock,pending;
    sigemptyset(&block);
    sigemptyset(&oldblock);
    for(int i = 1;i < 32;i++){
        sigaddset(&block,i);
        signal(i,func);
    }
    
    sigprocmask(SIG_SETMASK,&block,&oldblock);
    // for(int i = 1;i < 32;i++){
    //     if(i != 9 && i != 19){
    //         kill(getpid(),i);//发送除开9,19号信号
    //     }
    //     // if(i == 9 || i== 19)
    //     //     continue;

    //     // kill(getpid(),i);
    //     // if(i == 18)
    //     //     cout << i << endl;
    //}
    //kill(getpid(),18);再发一次18号信号,直接导致20,21,22信号都没了？
    while(true){
        int n = sigpending(&pending);
        if(n < 0)
            continue;
        cout << "pid : "<< getpid() << endl;
        Print(pending);//打印penging表不应该除开9,19号位置是0,其他位置都是1,那为啥18号也是0？
        sleep(1);
        // sigprocmask(SIG_SETMASK,&oldblock,&block);
        // Print(oldblock);
        // Print(block);
    }

    // for(int i = 31;i > 17;i--)
    // {
    //     cout << "减少发送信号 " << i <<endl;
    //     sigprocmask(SIG_SETMASK,&block,&oldblock);//重新屏蔽
    //     // cout<< "原有屏蔽字段：";
    //     // Print(oldblock);
    //     // cout<< "现有屏蔽字段：";
    //     Print(block);
    //     for(int j = 1;j < i;j++)
    //     {
    //         if(j != 9 && j != 19){
    //            kill(getpid(),j);//发送除开9,19号信号
    //         }
    //     }
    //     int n = sigpending(&pending);
    //     if(n < 0)
    //         continue;
    //     cout << "pid : "<< getpid() << endl;
    //     cout<<"屏蔽的信号：";
    //     Print(pending);//打印penging表不应该除开9,19号位置是0,其他位置都是1,那为啥18号也是0？
    //     sigprocmask(SIG_SETMASK,&oldblock,&block);//解除屏蔽
    //     cout << "解除屏蔽"<<endl;
    //     sigpending(&pending);
    //     cout<<"处理信号结果(pending表):";
    //     Print(pending);

    //     // cout<< "原有屏蔽字段：";
    //     // Print(oldblock);
    //     // cout<< "现有屏蔽字段：";
    //     // Print(block);
        
    // }

    
    // kill(getpid(),18);
    // kill(getpid(),20);//18号信号丢失
    
    // //kill(getpid(),18);//20号信号丢失
    // for(int i = 21;i < 32;i++)
    // {
    //     kill(getpid(),i);
    // }//18号信号缺失
    // kill(getpid(),18);//20,21,22信号丢失

    // //18与21,22单独测试
    // kill(getpid(),18);
    // // kill(getpid(),21);//18号信号丢失
    // // kill(getpid(),18);//21号信号丢失
    // //kill(getpid(),22);//18号信号丢失
    // kill(getpid(),18);//22号信号丢失

    // //结论：用kill函数发信号，18号信号与20,21,22,不能同时存在,谁先发谁丢失


    // sleep(2);
    // sigpending(&pending);
    // Print(pending);//打印penging表不应该除开9,19号位置是0,其他位置都是1,那为啥18号也是0？
    // cout << "解除屏蔽"<<endl;
    // sigprocmask(SIG_SETMASK,&oldblock,&block);//解除屏蔽
    
    // sigpending(&pending);
    // Print(pending);
    // sleep(2);


    //sigprocmask(SIG_SETMASK,&block,&oldblock);
    // Print(block);
    // pid_t pid = getpid();
    // kill(pid,18);

    // pid_t id = fork();
    // for(int i = 20;i < 23;i++)
    // {
    //     if(id == 0)
    //     {
    //         kill(pid,i);
    //     }
    // }

    // sleep(2);
    // sigpending(&pending);
    // Print(pending);//打印penging表不应该除开9,19号位置是0,其他位置都是1,那为啥18号也是0？
    // cout << "解除屏蔽"<<endl;
    // sigprocmask(SIG_SETMASK,&oldblock,&block);//解除屏蔽
    
    // sigpending(&pending);
    // Print(pending);
    // sleep(2);


    return 0;
}



// int main()
// {
//     // for(int i = 1;i < 32;i++)
//     // {
//     //     signal(i,func);
//     // }
//     signal(17,func);
//     for(int i = 0;i < 10;i++)
//     {
//         pid_t id = fork();
//         if(id == 0)
//         {
//             cout << "子进程-" << i << ",pid:" << getpid() << endl;
//             sleep(2);
//             exit(0);
//         }
//         sleep(1);
//     }

    
//    while(true);
//    sleep(10);
//     int status = 0;
//     pid_t pid = waitpid(-1,&status,0);
//     if(pid == -1)
//     {
//         perror("wait");

//     }
//     sleep(5);
//     cout << "pid:" << pid << "exit:" << ((status>>8)&0xFF)<< "signal:" <<(status&0x7F) << "core dump:" << ((status>>7)&1) << endl; 

    // while(true)
    // {
    //     cout<<"我是进程："<<getpid()<<endl;
    //     sleep(1);
    // }
//     return 0;
// }